import { ActionContext, ActionTree } from "vuex";
import { State } from "./state";
import { Mutations } from "./mutations";

import { RootState } from "../index";
import { Mutation } from ".";

//! 还是常量代替名称写法
export enum Action {
  initAuthor = "initAuthor",
}

//声明动作中心内容 给下面的动作提供类型推断
//这个类型的目的就是映射出参数 为后面的提示做准备
//! keyof 取得主键
//! Parameters 取得参数
//! ReturnType 获得返回值
//! Omit 去除原来的某个类型
//? 目的是重写掉里面的commit 让代码有智能提示 TS的存在就是为了类型提示
type AugmentedActionContext = {
  commit<K extends keyof Mutations>(
    key: K,
    payload?: Parameters<Mutations[K]>[1]
  ): ReturnType<Mutations[K]>;
} & Omit<ActionContext<State, RootState>, "commit">;

//动作类型接口
export interface Actions {
  [Action.initAuthor]({
    state,
    commit,
    dispatch,
  }: AugmentedActionContext): void;
}

//动作实体类
export const actions: ActionTree<State, RootState> & Actions = {
  [Action.initAuthor]({ state, commit, dispatch }) {
    //聚合后具有代码提示了
    commit(Mutation.UPDATEAUTHOR);
  },
};
